import { getToken, setToken, removeToken, setTimeStamp } from "@/utils/auth";
import { login, getUserInfo, getUserDetailById } from "@/api/user";
import { resetRouter } from "@/router";
const state = {
  token: getToken(), //设置token为共享状态,初始化vuex的时候就从缓存在读取token
  userInfo: {},
};
const mutations = {
  setToken(state, token) {
    state.token = token;
    setToken(token);
  },
  removeToken(state) {
    state.token = null;
    removeToken();
  },
  //设置用户信息
  setUserInfo(state, result) {
    //更新一个对象
    state.userInfo = result; //这样是响应式
    // state.userInfo={...result} //这样是浅拷贝 也是响应式
    //state.userInfo['username']=result 这样不是响应式
  },
  //删除用户信息
  removeUserInfo(state) {
    state.userInfo = {};
  },
};
const actions = {
  // 用户登录
  async login(context, data) {
    const result = await login(data); //拿到token  请求接口返回的数据已经在request.js处理过
    //登录成功
    context.commit("setToken", result); //设置token
    //设置时间戳
    setTimeStamp();
  },
  // 获取用户个人信息及头像
  async getUserInfo(context) {
    const result = await getUserInfo();
    const baseInfo = await getUserDetailById(result.userId);
    //  将两个数据的结果进行合并
    const baseResult = { ...result, ...baseInfo };
    context.commit("setUserInfo", baseResult);
    return result; //这里为什么要return呢，这里是给后期做权限效验的时候，留下的伏笔
  },
  //退出登录
  loginOut(context) {
    //删除token
    context.commit("removeToken");
    //删除用户资料
    context.commit("removeUserInfo");
    //重置我们的路由
    resetRouter();
    //去设置权限路由下的权限为初始只有静态路由的状态
    //user和permission都是vuex下面的两个子模块，子模块调用子模块的action(都没加锁的情况下可以随意调用，不加命名空间的情况下，所有的mutations和action都是挂载在全局下，加了命名空间的子模块调用另一个加了命名空间的子模块的mutaions,可以在调用的时候加上第三个参数对象{root:true} 意思是调用根级的mutations或action
    //加了命名空间的模块下的context指的不是全局的context,而指的是user模块下的mutations
    context.commit("permission/setRoutes", [], { root: true });
  },
};
export default {
  namespaced: true,
  state,
  mutations,
  actions,
};
